#ifndef DATAHANDLER_H
#define DATAHANDLER_H

#include <QObject>
#include <QByteArray>
#include <QVector>
// 定义一个结构体来存储协议字段
struct ProtocolData {
    quint8 feedbackType;   // 反馈类型
    quint8 command;        // 命令
    quint8 dataLength;    // 数据长度
    QByteArray dataId;        // 数据编号
    QByteArray data;      // hex数据
    QVector<float> dataVec; //转为可读的类型的数据
    quint8 ack;           // ACK
    quint8 checksum;      // 校验字

    ProtocolData()
        : feedbackType(0), command(0), dataLength(0), dataId(0), data(0),dataVec(), ack(0), checksum(0) {}
};

// 定义一个结构体来存储不同命令的响应数据
struct CommandResponse {
    QString handshakeSignal;  // 握手信号
    QString deviceVersion;    // 设备版本号
    QString filterTypes;      // 滤光片类型
    QString autoMeasureResponse; // 启动自动测量数据命令响应
    QString readMeasureResponse;  // 读取自动测量数据命令响应
    QString unknownCommand;   // 处理未知命令

    void clear(){
        handshakeSignal.clear();
        deviceVersion.clear();
        filterTypes.clear();
        autoMeasureResponse.clear();
        readMeasureResponse.clear();
        unknownCommand.clear();
    }
};
/**
 * @brief The DataHandler 类
 * 负责处理从串口接收到的数据，包含数据解析和校验功能。
 */
class DataHandler : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * 初始化 DataHandler 对象。
     * @param parent 父对象指针
     */
    explicit DataHandler(QObject *parent = nullptr);
    /**
     * @brief 计算数据包的校验位
     * 对给定的数据进行校验计算，返回校验值。
     * @param data 数据包的内容（不包括最后一个字节的校验位）
     * @return 计算出的校验位
     */
    quint8 calculateChecksum(const QByteArray &data) const;
    /**
     * @brief 解算滤光片类型函数
     * @param filterTypes
     * @return
     */
    QString parseFilterTypes(const QString& filterTypes);
    /**
     * @brief 校验位校验完成后第一步解算到结构体中
     * @param 校验后的正确帧
     */
    void dataReceivedToStructFun(const QByteArray &data);
    /**
     * @brief 校验位校验完成后解算光照度
     * @param 校验后的正确帧
     */
    QVector<float> dataReceivedToFloat(const QByteArray &data);

public:
    // 定义 ProtocolData 结构体变量来存储协议数据
    ProtocolData protocolData;
    // 根据命令类型处理不同的数据
    CommandResponse response;
signals:
    /**
     * @brief 数据校验位正确，发出信号处理数据
     * @param processedData 校验后的数据
     */
    void dataProcessedToStruct(const QByteArray &processedData);
    /**
         * @brief 解算结构体中的数据信号
         * @param responseData
         */
    void structDateHandle(const CommandResponse &responseData);

private:
    /**
     * @brief saveRawDataByDay 保存原始数据
     * @param data 原始数据
     */
    void saveRawDataByDay(const QByteArray data);

};

#endif // DATAHANDLER_H
